#ifndef _STM32_GPIO_H__
#define _STM32_GPIO_H__

#include "os/types.h"

typedef void (*exti_handler)(void);

#define PORTA    0
#define PORTB    1
#define PORTC    2
#define PORTD    3
#define PORTE    4
#define PORTF    5
#define PORTG    6
#define PORTH    7

#define PORT_MAX 12

#define PIN0                 ((u16)0x0001)  /* Pin 0 selected    */
#define PIN1                 ((u16)0x0002)  /* Pin 1 selected    */
#define PIN2                 ((u16)0x0004)  /* Pin 2 selected    */
#define PIN3                 ((u16)0x0008)  /* Pin 3 selected    */
#define PIN4                 ((u16)0x0010)  /* Pin 4 selected    */
#define PIN5                 ((u16)0x0020)  /* Pin 5 selected    */
#define PIN6                 ((u16)0x0040)  /* Pin 6 selected    */
#define PIN7                 ((u16)0x0080)  /* Pin 7 selected    */
#define PIN8                 ((u16)0x0100)  /* Pin 8 selected    */
#define PIN9                 ((u16)0x0200)  /* Pin 9 selected    */
#define PIN10                ((u16)0x0400)  /* Pin 10 selected   */
#define PIN11                ((u16)0x0800)  /* Pin 11 selected   */
#define PIN12                ((u16)0x1000)  /* Pin 12 selected   */
#define PIN13                ((u16)0x2000)  /* Pin 13 selected   */
#define PIN14                ((u16)0x4000)  /* Pin 14 selected   */
#define PIN15                ((u16)0x8000)  /* Pin 15 selected   */

#define PIO(g,p) ((g<<16) | p)
#define PIN(io) (io & 0xFFFF)
#define PORT(io) ((io>>16) & 0xFFFF)

#define EXINT_TRIG_FALLING   0x01
#define EXINT_TRIG_RAISING  0x02
#define EXINT_TRIG_ALL    (EXINT_TRIG_FALLING|EXINT_TRIG_RAISING)

#include "at32f413.h"
void gpio2_init(u32 io, gpio_mode_type mode, gpio_drive_type drv_str, gpio_output_type outtype, gpio_pull_type pull);
void gpio2_init_output(u32 io, gpio_output_type outtype, gpio_pull_type pull);
void gpio2_init_input(u32 io, gpio_pull_type pull);
void gpio2_init_can(u32 rx_pio, u32 tx_pio);
void gpio2_init_analog(u32 pio);
void exti_subscribe(u32 io, u32 edge, exti_handler handler);
void exti_unsubscribe(u32 io);
bool exti_is_pending_clear(u32 io);
void gpio2_write(u32 io, bool set);
bool gpio2_read(u32 io);
#endif /* _STM32_GPIO_H__ */

